package mbean;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import util.FacesUtil;
import vo.OrganizationVO;
import vo.UsuarioVO;
import dao.UsuarioDAO;

public class UserMBean extends AbstractMBean{

	private String nome, login, senha, novaSenha, confirmaNovaSenha, loginAntigo;
	private List<UsuarioVO> listaResultadoBusca;	
	private int id, back;
	private UsuarioDAO dao;
	private List<String> listAbleOrgnizations, listSelectedOrganizations;
	private Map<String, OrganizationVO> mapaAbleOrganizations;
	private boolean menuSaveDisabled, inserting;
	
	public UserMBean(){
		dao = new UsuarioDAO();
		this.menuSaveDisabled = true;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public String getNome() {
		return nome;
	}

	public void setLogin(String login) {
		this.login = login;
	}

	public String getLogin() {
		return login;
	}

	public void setSenha(String senha) {
		this.senha = senha;
	}

	public String getSenha() {
		return senha;
	}
	
	public String searchUser(){
		String retorno;
				
		UsuarioVO vo = new UsuarioVO();
		vo.setLogin(login);
		vo.setNome(nome);
		listaResultadoBusca = dao.searchUser(vo);
		
		if (listaResultadoBusca.size() > 0)
			retorno = "search";
		else{
			retorno = "erro";
			FacesUtil.addErrorMessage(FacesUtil.getMessageResourceString("errorSearchEmpty"));
		}
		
		return retorno;
	}

	public void setListaResultadoBusca(List<UsuarioVO> listaResultadoBusca) {
		this.listaResultadoBusca = listaResultadoBusca;
	}

	public List<UsuarioVO> getListaResultadoBusca() {
		return listaResultadoBusca;
	}

	public String save(){
		String retorno;
		
		if (validaTela()){
			UsuarioVO vo = new UsuarioVO();
			vo.setLogin(this.login);
			vo.setNome(this.nome);			
			vo.setOrganizations(new ArrayList<OrganizationVO>());
			
			for(String key: this.listSelectedOrganizations){
				vo.getOrganizations().add(this.mapaAbleOrganizations.get(key));
			}
			
			int tmp = 0;			
			if (this.id > 0){
				if (this.novaSenha.equalsIgnoreCase(""))
					vo.setSenha("");
				else
					vo.setSenha(this.novaSenha);
				
				vo.setId(this.id);
				dao.updateUser(vo);
			}
			else{
				vo.setSenha(this.senha);
				tmp = dao.insertUser(vo);
			}
			
			if (tmp == 0){
				retorno = "success";
				
				this.login = "";
				this.nome = "";
				this.senha = "";
				this.menuSaveDisabled = true;
				this.inserting = false;
				setaTela(false, "user");
			}
			else{
				FacesUtil.addErrorMessage(FacesUtil.getMessageResourceString("errorLoginExits"));
				retorno = "erro";
			}			
		}
		else
			retorno = "erro";
		
		return retorno;
	}
	
	public String abreInsertUser(){
		this.login = "";
		this.nome = "";
		this.senha = "";
		this.menuSaveDisabled = false;
		this.inserting = true;
		setaTela(true, "user");

		loadOrganizations();
		
		return "insertUser";
	}

	private void loadOrganizations() {
		LoginMBean login = (LoginMBean) FacesUtil.getSessionMapValue("login");
		int usuarioLogadoId = login.getId();
		if (login.isAdmin())
			this.mapaAbleOrganizations = this.dao.getOrganizations(-1);
		else
			this.mapaAbleOrganizations = this.dao.getOrganizations(usuarioLogadoId);
		
		this.listAbleOrgnizations = new ArrayList<String>();
		this.listSelectedOrganizations = new ArrayList<String>();
		for(String key:this.mapaAbleOrganizations.keySet()){
			this.listAbleOrgnizations.add(key);
		}
		
		if (this.id > 0){
			Map<String, OrganizationVO> tmp = this.dao.getOrganizations(id);
			
			for(String key:tmp.keySet()){
				this.listSelectedOrganizations.add(key);
			}			
		}
		
		this.listAbleOrgnizations.removeAll(this.listSelectedOrganizations);
	}

	private boolean validaTela() {
		boolean retorno = true;
		
		if (this.nome.equalsIgnoreCase("")){
			FacesUtil.addErrorMessage(FacesUtil.getMessageResourceString("errorNameRequired"));
			retorno = false;
		}
		
		if (this.login.equalsIgnoreCase("")){
			retorno = false;
			FacesUtil.addErrorMessage(FacesUtil.getMessageResourceString("errorLoginRequired"));
		}
		
		if (this.senha.equalsIgnoreCase("")){
			retorno = false;
			FacesUtil.addErrorMessage(FacesUtil.getMessageResourceString("errorPaswdRequired"));
		}		
		
		if ((this.novaSenha != null) && (! novaSenha.equalsIgnoreCase("")) && (! novaSenha.equalsIgnoreCase(confirmaNovaSenha))){
			FacesUtil.addErrorMessage(FacesUtil.getMessageResourceString("errorNewPassword"));
			retorno = false;
		}
		
		if ((! login.equalsIgnoreCase(this.loginAntigo) && (dao.existeLogin(login)))){
			FacesUtil.addErrorMessage(FacesUtil.getMessageResourceString("errorLoginExist"));
			retorno = false;
		}
		
		return retorno;
	}

	public void setNovaSenha(String novaSenha) {
		this.novaSenha = novaSenha;
	}

	public String getNovaSenha() {
		return novaSenha;
	}

	public void setConfirmaNovaSenha(String confirmaNovaSenha) {
		this.confirmaNovaSenha = confirmaNovaSenha;
	}

	public String getConfirmaNovaSenha() {
		return confirmaNovaSenha;
	}
	
	public void setId(int id) {
		this.id = id;
	}

	public int getId() {
		return id;
	}

	public void setLoginAntigo(String loginAntigo) {
		this.loginAntigo = loginAntigo;
	}

	public String getLoginAntigo() {
		return loginAntigo;
	}

	public void setBack(int back) {
		this.back = back;
	}

	public int getBack() {
		return back;
	}

	public void setListAbleOrgnizations(List<String> listAbleOrgnizations) {
		this.listAbleOrgnizations = listAbleOrgnizations;
	}

	public List<String> getListAbleOrgnizations() {
		return listAbleOrgnizations;
	}

	public void setMapaAbleOrganizations(Map<String, OrganizationVO> mapaAbleOrganizations) {
		this.mapaAbleOrganizations = mapaAbleOrganizations;
	}

	public Map<String, OrganizationVO> getMapaAbleOrganizations() {
		return mapaAbleOrganizations;
	}

	public void setListSelectedOrganizations(
			List<String> listSelectedOrganizations) {
		this.listSelectedOrganizations = listSelectedOrganizations;
	}

	public List<String> getListSelectedOrganizations() {
		return listSelectedOrganizations;
	}
	
	public String abreTelaView(){
		loadOrganizations();
		this.menuSaveDisabled = false;
		this.inserting = false;
		setaTela(true, "user");
		
		return "view";
	}
	
	public String redirecionaBack(){
		if (this.back == 0){
			setaTela(true, "strategy");
			return "backStrategicPlan";
		}
		else{
			setaTela(false, null);
			return "backIndex";
		}
	}

	public void setMenuSaveDisabled(boolean menuSaveDisabled) {
		this.menuSaveDisabled = menuSaveDisabled;
	}

	public boolean getMenuSaveDisabled() {
		return menuSaveDisabled;
	}
	
	public String open(){
		this.menuSaveDisabled = true;
		this.inserting = false;
		setaTela(false, "user");
		return "user";
	}
	
	public String back(){
		this.menuSaveDisabled = true;
		this.inserting = false;
		setaTela(false, "user");
		return "back";
	}

	@Override
	public boolean isDirty() {
		boolean dirty = false;
		UsuarioVO vo = this.dao.getUser(this.login);
		
		if (inserting)
			dirty = true;
		else{
			if (! vo.getNome().equalsIgnoreCase(this.nome))
				dirty = true;
			
			if (! vo.getLogin().equalsIgnoreCase(this.login))
				dirty = true;
			
			if (! this.novaSenha.equalsIgnoreCase(""))
				dirty = true;
			
			if (! this.confirmaNovaSenha.equalsIgnoreCase(""))
				dirty = true;
			
			List<OrganizationVO> lista = new ArrayList<OrganizationVO>();
			for(String key:listSelectedOrganizations){
				lista.add(this.mapaAbleOrganizations.get(key));
			}
			
			if (! vo.getOrganizations().equals(lista))
				dirty = true;
		}
		
		return dirty;
	}
}
